class Solution {
        List<Integer> re = new ArrayList<>();
    public List<Integer> findSubstring(String s, String[] words) {
        //如果没有全部都找到的话，返回空，
        //创建一个hashmap 来存放word中的元素，可以有标记
        //《注意子串要与 words 中的单词完全匹配，中间不能有其他字符 ，但不需要考虑 words 中单词串联的顺序。》
        //每一个元素的长度
        int lenw = words[0].length();
        //有多少元素
        int len = words.length;
        if(len == 0){
            return re;
        }
        //这个map是用来存放所有words中的元素的
        HashMap<String,Integer> map = new HashMap<>();

        //这个map用来看，找到的元素中会不会有重复的
        HashMap<String,Integer> temp = new HashMap<>();

        for(String word : words){
            //把每一个元素都添加到map中；
            //map.put(num, map.getOrDefault(num, 0) + 1)；用来统计数字出现的次数：
            map.put(word,map.getOrDefault(word,0) + 1);
        }
        //因为当i > s.length - lenw*len 说明 i往后没有lenw*len这么多元素了
        //所以一定不可能有
        for(int i = 0 ; i<=s.length() - lenw*len ;i++){
            //每一次循环，清空一下temp中的元素
            temp.clear();
            
            //有多少元素
            int j;
            for(j = 0 ; j < len ;j++){
                //如果这个word 在map中的话，就继续往下走，
                String b = s.substring( i+j*lenw , i+j*lenw + lenw);
                
                if(map.containsKey(b)){
                    //map.put(num, map.getOrDefault(num, 0) + 1)；用来统计数字出现的次数：
                    temp.put(b , temp.getOrDefault(b,0) + 1);
                    //这个情况说明有重复，此时这个循环continue；
                    if(temp.get(b) > map.get(b)){
                        break;
                    }
                //不包含这个元素，直接break
                }else{
                    break;
                }
            }
            //说明 内循环走到头了，此时元素匹配
            if(j == len){
                re.add(i);
            }
        }
        return re;
    }
}